using Sinacor.Infra.UI.Common;
using Sinacor.Infra.UI.Security.Services;
using System.Collections.Generic;
using System;
using System.Linq;
using Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.Bovespa.ManutencaoOrdens.Justificativa;
using Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.Bovespa.ManutencaoOrdens.Calendario;
using Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.Bovespa.ManutencaoOrdens.Operador;
using Sinacor.UI.Bovespa.ManutencaoOrdens.Communication.Bovespa.ManutencaoOrdens.Titulo;

namespace Sinacor.UI.Bovespa.ManutencaoOrdens.Communication
{

    /// <summary>
    /// Modelo da entidade de Calendario Da Ordem
    /// </summary>
    public class Titulo : BaseCommunication
    {
        #region Atributos

        private ModelCollection<Model.Titulo> _cacheTitulos;

        #endregion

        public Titulo(SessionInformation sessionInformation)
            : base(sessionInformation)
        {
            _cacheTitulos = new ModelCollection<Model.Titulo>();
        } 

		/// <summary>
		/// Aplicar cache conforme especificado no diagrama de atividade Titulo.
		/// ObterTitulo()
		/// </summary>
		/// <param name="request"></param>
        public Model.Titulo ObterTitulo(Model.Parameter.FiltroTitulo model)
        {
            Model.Titulo retorno = null;
            ITitulo servico = null;

            try
            {
                if (model.UtilizaCache)
                {
                    if (!String.IsNullOrEmpty(model.CodigoNegocio))
                        retorno = _cacheTitulos.FirstOrDefault(x => x.Codigo == model.CodigoNegocio);
                }

                if (retorno == null)
                {
                    using (ServiceInstance<ITitulo> service = new ServiceInstance<ITitulo>())
                    {
                        servico = service.TryGetInstance(this.Session);

                        ConsultarTituloCodigoRequest request
                            = new Translator.ModelToDataContract.Titulo().ToConsultarTituloCodigoRequest(model);

                        retorno = new Translator.DataContractToModel.Titulo().ToTitulo(servico.ObterTitulo(request));

                        if (model.UtilizaCache
                            && retorno != null)
                            _cacheTitulos.Add(retorno);
                    }
                }
            }
            catch (Exception ex)
            {
                HandleFault(ex);
            }

            return retorno;
		}
	}
}